from rest_framework import serializers
from .utils import QQOauth
from django_redis import get_redis_connection
from .models import OAuthQQUser
from users.models import User


class QQLoginCheckSerializer(serializers.Serializer):
    """第一次QQ登录绑定信息序列化器"""
    # 定义要进行验证的字段
    mobile = serializers.RegexField(label='手机号', regex=r'^1[3-9]\d{9}$')
    password = serializers.CharField(label='密码', max_length=20, min_length=8)
    sms_code = serializers.CharField(label='短信验证码')
    access_token = serializers.CharField(label='QQ密钥')

    def validate(self, data):
        # 1.验证access_token是否正确
        openid = QQOauth.check_access_token(data['access_token'])
        if not openid:
            raise serializers.ValidationError('QQ登录凭证错误')
        # 将openid存储到验证数据中
        data['openid'] = openid

        # 2.判断短信验证码是否正确
        redis_conn = get_redis_connection('verify_codes')
        mobile = data['mobile']
        real_sms_code = redis_conn.get('sms_%s' % mobile)
        # 判断验证码是否存在
        if not real_sms_code:
            raise serializers.ValidationError('无效的短信验证码')
        # 和用户输入的短信验证码进行比对
        if real_sms_code.decode() != data['sms_code']:
            raise serializers.ValidationError('短信验证码错误')

        # 3.判断用户是否存在
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            # 用户不存在
            pass
        else:
            # 用户存在，则校验密码是否正确
            password = data['password']
            if not user.check_password(password):
                raise serializers.ValidationError('用户密码错误')
            # 将用户存储进验证数据中
            data['user'] = user
        # 返回通过验证的数据
        return data

    def create(self, validated_data):
        """QQ绑定用户信息"""
        # 从验证通过信息中获取user信息
        user = validated_data.get('user')

        # 如果用户不存在，则新建用户
        if not user:
            # 1.通过实例化模型类，然后设置实例字段属性进行创建用户
            # user = User()
            # user.mobile = validated_data.get('mobile')
            # user.set_password(validated_data.get('password'))
            # user.username = validated_data.get('mobile')
            # user.save()
            # 2.调用方法创建用户实例
            user = User.objects.create_user(
                username=validated_data.get('mobile'),
                password=validated_data.get('password'),
                mobile=validated_data.get('mobile')
            )

        # 如果用户存在，则与openid进行绑定
        # 1.通过调用方法创建用户
        oauth_user = OAuthQQUser.objects.create(
            openid=validated_data.get('openid'),
            user=validated_data.get('user')
        )
        # 2.通过对象实例创建用户
        # oauth_user = OAuthQQUser()
        # oauth_user.user = user
        # oauth_user.openid = validated_data.get('openid')
        # oauth_user.save()

        return user
